package com.jingfu.common;

import org.zalando.problem.StatusType;
import java.util.Arrays;
import java.util.Collections;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 *
 * @author jingfu
 */
public enum ErrorCode implements StatusType {
    CONTINUE(100, "Continue"),
    SWITCHING_PROTOCOLS(101, "Switching Protocols"),
    PROCESSING(102, "Processing"),
    CHECKPOINT(103, "Checkpoint"),
    OK(200, "OK"),
    CREATED(201, "Created"),
    ACCEPTED(202, "Accepted"),
    NON_AUTHORITATIVE_INFORMATION(203, "Non-Authoritative Information"),
    NO_CONTENT(204, "No Content"),
    RESET_CONTENT(205, "Reset Content"),
    PARTIAL_CONTENT(206, "Partial Content"),
    MULTI_STATUS(207, "Multi-Status"),
    ALREADY_REPORTED(208, "Already Reported"),
    IM_USED(226, "IM Used"),
    MULTIPLE_CHOICES(300, "Multiple Choices"),
    MOVED_PERMANENTLY(301, "Moved Permanently"),
    FOUND(302, "Found"),
    SEE_OTHER(303, "See Other"),
    NOT_MODIFIED(304, "Not Modified"),
    USE_PROXY(305, "Use Proxy"),
    TEMPORARY_REDIRECT(307, "Temporary Redirect"),
    PERMANENT_REDIRECT(308, "Permanent Redirect"),
    BAD_REQUEST(400, "Bad Request"),
    UNAUTHORIZED(401, "Unauthorized"),
    PAYMENT_REQUIRED(402, "Payment Required"),
    FORBIDDEN(403, "Forbidden"),
    NOT_FOUND(404, "Not Found"),
    METHOD_NOT_ALLOWED(405, "Method Not Allowed"),
    NOT_ACCEPTABLE(406, "Not Acceptable"),
    PROXY_AUTHENTICATION_REQUIRED(407, "Proxy Authentication Required"),
    REQUEST_TIMEOUT(408, "Request Timeout"),
    CONFLICT(409, "Conflict"),
    GONE(410, "Gone"),
    LENGTH_REQUIRED(411, "Length Required"),
    PRECONDITION_FAILED(412, "Precondition Failed"),
    REQUEST_ENTITY_TOO_LARGE(413, "Request Entity Too Large"),
    REQUEST_URI_TOO_LONG(414, "Request-URI Too Long"),
    UNSUPPORTED_MEDIA_TYPE(415, "Unsupported Media Type"),
    REQUESTED_RANGE_NOT_SATISFIABLE(416, "Requested Range Not Satisfiable"),
    EXPECTATION_FAILED(417, "Expectation Failed"),
    I_AM_A_TEAPOT(418, "I'm a teapot"),
    UNPROCESSABLE_ENTITY(422, "Unprocessable Entity"),
    LOCKED(423, "Locked"),
    FAILED_DEPENDENCY(424, "Failed Dependency"),
    UPGRADE_REQUIRED(426, "Upgrade Required"),
    PRECONDITION_REQUIRED(428, "Precondition Required"),
    TOO_MANY_REQUESTS(429, "Too Many Requests"),
    REQUEST_HEADER_FIELDS_TOO_LARGE(431, "Request Header Fields Too Large"),
    UNAVAILABLE_FOR_LEGAL_REASONS(451, "Unavailable For Legal Reasons"),
    INTERNAL_SERVER_ERROR(500, "Internal Server Error"),
    NOT_IMPLEMENTED(501, "Not Implemented"),
    BAD_GATEWAY(502, "Bad Gateway"),
    SERVICE_UNAVAILABLE(503, "Service Unavailable"),
    GATEWAY_TIMEOUT(504, "Gateway Timeout"),
    HTTP_VERSION_NOT_SUPPORTED(505, "HTTP Version Not Supported"),
    VARIANT_ALSO_NEGOTIATES(506, "Variant Also Negotiates"),
    INSUFFICIENT_STORAGE(507, "Insufficient Storage"),
    LOOP_DETECTED(508, "Loop Detected"),
    BANDWIDTH_LIMIT_EXCEEDED(509, "Bandwidth Limit Exceeded"),
    NOT_EXTENDED(510, "Not Extended"),
    NETWORK_AUTHENTICATION_REQUIRED(511, "Network Authentication Required"),

    USER_UNAUTHORIZED(432,"您没有权限访问，请联系管理员！"),

    VERTIFY_CODE_ERROR(433,"登录失败，验证码错误！"),

    USER_NAME_OR_PASSWORD_ERROR(444,"用户名或密码错误！"),

    USER_HAS_LOGIN(445,"该用户已登录，请勿重复操作！"),
    USER_LOGIN_ERROR(446,"登录异常，请联系管理员！"),

    PARAM_IS_ERROR(447, "参数错误！"),
    ACCOUNT_HAS_FORBIDDEN(448, "该账号已被禁用！"),

    ROLE_REPEATED(449, "角色标识不能重复！"),

    DICT_CODE_REPEATED(450, "字典code不能重复！"),
    DICT_VALUE_REPEATED(451, "字典值不能重复！"),

    PASSWORD_ERROR(452, "初始密码错误！"),

    USER_AVATAR_UPLOAD_FAIL(453, "用户头像上传失败！"),


    ;

    //private static final Map<Integer, ErrorCode> STATUSES = (Map)Arrays.stream(values()).collect(Collectors.collectingAndThen(Collectors.toMap(ErrorCode::getStatusCode, Function.identity()), Collections::unmodifiableMap));
    private final int code;
    private final String reason;

    private ErrorCode(final int statusCode, final String reasonPhrase) {
        this.code = statusCode;
        this.reason = reasonPhrase;
    }

    @Override
    public int getStatusCode() {
        return this.code;
    }


    @Override
    public String getReasonPhrase() {
        return this.reason;
    }

    @Override
    public String toString() {
        return this.getStatusCode() + " " + this.getReasonPhrase();
    }

    /*public static ErrorCode valueOf(final int code) {
        ErrorCode status = (ErrorCode) STATUSES.get(code);
        if (status == null) {
            throw new IllegalArgumentException("There is no known status for this code (" + code + ").");
        } else {
            return status;
        }
    }*/
}
